// object & type
//1.基本对象类型===> 入参指定属性和类型
let dataObj: { name: string, age: number } = {
    name: 'haha',
    age:18
}
dataObj = {
    name: 'yiyi',
    age:20
}
// 2.复杂对象类型
/***
 * data:number[] 数组类型的数字
 * myfunc:(item:number)=>number[] 函数类型传入数字 返回数组类型数值
 */
let complex: { data: number[], myfunc: (item: number) => number[] } = {
    data: [1, 2, 3],
    myfunc: function (item: number): number[] {
        this.data.push(item)
        return this.data
        
    }
}
console.log('打印对象中的函数', complex.myfunc(20));
// complex 中如果定义的类型太多或复杂我们可以定义自己的类型
// 3.type生成类型
type MyType={ data: number[], myfunc: (item: number) => number[] }
let complex2: MyType = {
    data: [1, 2, 3],
    myfunc: function (item: number): number[] {
        this.data.push(item)
        return this.data
    }
}
// ----------------------union type 检查类型 null undefined never
// 1.union type 同时定义多个类型
// number | string | boolean 可以接受这三种类型的值
let unionType: number | string | boolean = 12
unionType = '12'
unionType=true


// 2.检查类型
let checkType = '10'
if (typeof checkType == 'string') {
    console.log('是否为字符串类型','string');
}

// 3. null undefined 
let myNull = null
myNull = undefined //非严格模式下可以赋 null 和 undefined

// 4. never  
// 4.1 应用场景 抛出异常
function error(message: string): never{
    throw new Error(message)
}
// 4.2 死循环
function loop(): never{
    while (true) {
        
    }
}
// 4.3 自执行函数赋值给Number类型
let y: number;
y = (() => {
    throw new Error('message')  //抛出异常其实就是never类型
})()